package com.example.demo.jwt;

/**
 * Created with IntelliJ IDEA 2023.
 * Description:
 * User: homechen
 * Date: 2024-03-11
 * Time: 18:22
 */

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Header;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.springframework.util.StringUtils;

import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 测试一下 jwt
 */
public class JWTUtils {

    private static final long expiration = 30 * 60 * 1000; // 设置半个小时
    private static final String secretString = "PHSStunvXBdEgFEmMzzzJPckFR0IQPtWHSpeywWwBHkTEF9W/r3rC4PXWdHsqUDC";
    private static final Key key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));// 生成一个 key 签名 通过字符串

    /**
     * 获取 token
     *
     * @param claim 负载
     */
    public static String getToken(Map<String, Object> claim) {
        String jwt = Jwts.builder()
                .setClaims(claim) // 自定义的负载，内容
                .setIssuedAt(new Date()) // 设置签发时间
                .setExpiration(new Date(System.currentTimeMillis() + expiration)) // 设置token的过期时间
                // .signWith() // 设置签名  通过签名去验证 token 是否是伪造的
                .signWith(key)
                .compact(); // 生成token
        return jwt;
    }

    // 验证 token 是否合法
    public static Claims parseJWT(String jwt) {
        if (!StringUtils.hasLength(jwt)) {
            return null;
        }
        // 创建解析器
        JwtParser builder = Jwts.parserBuilder().setSigningKey(key).build();
        Claims claims = null;
        try {
            // 去解析 token
            claims = builder.parseClaimsJws(jwt).getBody(); //解析失败会抛异常
        } catch (Exception e) {
            e.printStackTrace();
        }
        return claims;
    }

}
